#ifndef BASE_SYSTEM_LOG_INCLUDE_LOG_H
#define BASE_SYSTEM_LOG_INCLUDE_LOG_H

#include <cstring>
#include "global_logger.h"
#include "log_format.h"
#include "log_stream.h"

// 提取文件名（不含路径）
#ifndef __FILENAME__
#ifdef _WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#else
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#endif
#endif

// 编译期日志级别过滤
#ifndef MIN_LOG_LEVEL
#ifdef  IS_DEBUG
#define MIN_LOG_LEVEL Base::SystemLog::LOG_LEVEL_DEBUG
#else
#define MIN_LOG_LEVEL Base::SystemLog::LOG_LEVEL_INFO
#endif
#endif



// 内部宏：创建日志流并应用格式化
#define LOG_STREAM(level) \
    if (level < MIN_LOG_LEVEL) ; \
    else if (level < Base::SystemLog::GlobalLogger::GetInstance().GetLogger().GetMinLevel()) ; \
    else Base::SystemLog::LogStream(level, __FILENAME__, __LINE__) \
        << Base::SystemLog::LogFormat::Default()

// 内部宏：创建日志流并应用毫秒级格式化
#define LOG_STREAM_MS(level) \
    if (level < MIN_LOG_LEVEL) ; \
    else if (level < Base::SystemLog::GlobalLogger::GetInstance().GetLogger().GetMinLevel()) ; \
    else Base::SystemLog::LogStream(level, __FILENAME__, __LINE__) \
        << Base::SystemLog::LogFormat::DefaultWithMilliseconds()

// 公共日志宏
#define SYS_LOG_CONCAT(prefix, level) prefix ## level
#define SYS_LOG(level) LOG_STREAM(Base::SystemLog::SYS_LOG_CONCAT(LOG_LEVEL, level))

// 毫秒级日志宏
#define SYS_LOG_MS(level) LOG_STREAM_MS(Base::SystemLog::SYS_LOG_CONCAT(LOG_LEVEL, level))

// 条件日志宏
#define LOG_IF(level, condition) \
    if (!(condition)) ; \
    else LOG_STREAM(level)

#define SYS_LOG_IF(level, condition) LOG_IF(Base::SystemLog::SYS_LOG_CONCAT(LOG_LEVEL, level), condition)

// 定期日志宏（每N次记录一次）
#define LOG_EVERY_N(level, n) \
    for (static int __log_count__ = 0; \
        ++__log_count__ % (n) != 0 ? false : (__log_count__ = 0, true); \
        ) \
        LOG_STREAM(level)

#define SYS_LOG_EVERY_N(level, n) LOG_EVERY_N(Base::SystemLog::SYS_LOG_CONCAT(LOG_LEVEL, level), n)

#endif // BASE_SYSTEM_LOG_INCLUDE_LOG_H